﻿// 1302 等效电阻.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/22/problem/1079

给你一张电路图，有 n个顶点和 m条边，顶点编号从 1到 n。
1 号顶点为正极，n号顶点为负极，电路图保证连通。

边 (i,j,c)表示第 i 号顶点和第 j 号顶点间存在一条电路，
中间有一个电阻值为 c 的电阻，两个顶点之间可能有多个并联电阻线路。

现在问你对于整个电路，从 1 号点到 n 号点的等效电阻为多少。

提示：
串联电路: R=R1+R2+...+Rn
并联电路：1/R=1/R1+1/R2+...+1/Rn
Ii,j=Ui,j/Ri,j
除了正负极外顶点，有 Iin=Iout
等效电阻 R1,n=U1,n/I

输入格式
第一行两个正整数 n 和 m，表示顶点数和边数。

接下来 m 行，每行三个整数 i,j,c
，表示 i 号顶点和 j 号顶点中间有一个电阻为 c 的通路。

数据保证顶点 1 和顶点 n 连通。

输出格式
输出一行一个数表示答案。

只要你的答案和标准答案相对误差或者绝对误差在 10−6以内就算通过。                             

样例输入1
3 3
1 2 1
1 2 1
2 3 2
样例输出1
2.5000000000
样例输入2
4 5
1 2 1
2 4 4
1 3 8
3 4 19
2 3 12
样例输出2
4.2098138748
数据范围
对于 100%的数据，保证 2≤n≤50,1≤m≤2000,1≤i,j≤n,i≠j,1≤c≤104。
*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;

int n, m;
const double eps = 1 - 10;
double a[101][101], b[101], r[101][101], f[101];

void gauss() {
	n -= 2;
	int l = 1;
	for (int i = 1; i <= n; i++) {
		for (int j = l + 1; j <= n; j++) 
			if (abs(a[i][j]) > abs(a[l][i])) {
				for (int k = i; k <= n; k++)
					swap(a[j][k], a[l][k]);
				swap(b[j], b[l]);
			}
		if(abs(a[l][i])<eps)
			continue;
		for(int j = 1;j<=n;j++)
			if (j != l && abs(a[j][i]) >= eps) {
				double delta = a[j][i] / a[l][i];
				for (int k = i; k <= n; k++)
					a[j][k] -= a[l][k] * delta;
				b[j] -= b[l] * delta;
			}
		++l;
	}

	f[1] = 1; f[n + 2] = 0;
	for (int i = 1; i <= n; i++)
		f[i + 1] = b[i] / a[i][i];
	n += 2;
	double x = 0;
	for (int i = 2; i <= n; i++)
		if (abs(r[1][i]) >= eps)
			x += (f[1] - f[i]) * r[1][i];

	printf("%.10f", 1.0 / x);
}


 

int main()
{
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		scanf("%d%d%d",&x,&y,&z);
		r[x][y] += 1.0 / z;
		r[y][x] += 1.0 / z;
	}

	for(int i = 2;i<n;i++)
		for(int j =1;j<=n;j++)
			if (abs(r[i][j]) >= eps) {
				if (j == 1)
					b[i - 1] += r[i][j];
				else
					if (j < n)
						a[i - 1][j - 1] -= r[i][j];
				a[i - 1][i - 1] += r[i][j];
			}

	gauss();

	return 0;
}

 